iT邦幫忙

2023 iThome 鐵人賽

DAY 4
2
AI & Data

ML From Scratch系列 第 4

[Day 4] Polynomial Regression — 解決真實問題

  • 分享至 

  • xImage
  •  

終於到第一次開始實做 Real World problem 了!!!
這裡我們會透過 Kaggle competition 來了解 Polynomial Regression 如何應用。

Kaggle

Kaggle 是一個專門提供給資料科學領域的競賽平台。在參加這次競賽前請先註冊帳號。

Titanic - Machine Learning from Disaster

https://ithelp.ithome.com.tw/upload/images/20230904/20152821kQQKo7ZI1r.png

這裡我們會參加這個競賽,這也是入門Kaggle中最經典的一個競賽,主要目標就是預測 Titanic 上的乘客生還得可能性,算是一種 Binary classification 的任務,非常適合透過這次所介紹的 Polynomial Regression 來解決問題。

Implementation

Import Library

import pandas as pd
import numpy as np

Load Dataset

train_data = pd.read_csv('/kaggle/input/titanic/train.csv')
test_data = pd.read_csv('/kaggle/input/titanic/test.csv')

# Select relevant columns and drop rows with missing values
train_data = train_data[['Pclass', 'Sex', 'Age', 'Fare', 'Survived']].dropna()
test_data = test_data[['Pclass', 'Sex', 'Age', 'Fare']]

# Convert 'Sex' column to numeric values (e.g., Male: 0, Female: 1)
train_data['Sex'] = train_data['Sex'].map({'male': 0, 'female': 1})
test_data['Sex'] = test_data['Sex'].map({'male': 0, 'female': 1})

# Separate features and target for training data
X_train = train_data[['Pclass', 'Sex', 'Age', 'Fare']].values
y_train = train_data['Survived'].values

這裡主要是透過 Kaggle notebook 開發,所以在其他地方開發的讀取資料集的路徑 pd.read_csv 要更改一下。

我們所要使用的 feature 僅有 'Pclass', 'Sex', 'Age', 'Fare', 'Survived' 這些 column,當然其他 column 也可以使用。

要注意的是 Polynomial Regression 所需要的資料必須是數值形式,所以在性別的 Male 和 Female 我們分別對應到 0 和 1。

輸入項 x 是 'Pclass', 'Sex', 'Age', 'Fare',而輸出項 y 則是 'Survived'

Library from scratch

這裡所使用到的 function 跟昨天一樣。

不過這次需要另一個 function StandardScaler

class CustomStandardScaler:
    def __init__(self):
        self.mean = None
        self.std = None
        
    def fit(self, X):
        self.mean = np.mean(X, axis=0)
        self.std = np.std(X, axis=0)
        
    def transform(self, X):
        if self.mean is None or self.std is None:
            raise ValueError("Scaler has not been fitted. Call fit() before transform().")
            
        X_normalized = (X - self.mean) / self.std
        return X_normalized
    
    def fit_transform(self, X):
        self.fit(X)
        return self.transform(X)

透過此函式,餵入的數據將會進行標準化(Z-Score),並呈現正態分佈,其中標準化後的數據集平均值為0標準差為1

https://chart.googleapis.com/chart?cht=tx&chl=%24%24z%3D%5Cfrac%7Bx-%5Cmu%7D%7B%5Csigma%7D%24%24

其中https://chart.googleapis.com/chart?cht=tx&chl=x是需要被標準化的原始數值,https://chart.googleapis.com/chart?cht=tx&chl=%5Cmu是母體的平均,https://chart.googleapis.com/chart?cht=tx&chl=%5Csigma是母體的標準差。

class CustomFeatureTransformer:
    def __init__(self, degree, is_bias=True):
        self.is_bias = is_bias
        self.degree = degree
    
    def transform(self, x = None):
        if x is None:
            raise ValueError('x is None')
        if self.is_bias:
            x = np.c_[np.ones(x.shape[0]), x]
        for i in range(2, self.degree + 1):
            x = np.c_[x, x[:, 1] ** i]
        return x
    
    def fit_transform(self, x):
        return self.transform(x)
        
class CustomLinearRegression:
    def __init__(self):
        self.w = None
    
    def fit(self, x, y):
        self.w = np.linalg.inv(x.T.dot(x)).dot(x.T).dot(y)
    
    def predict(self, x):
        return x.dot(self.w)
    
    def score(self, x, y):
        y_pred = self.predict(x)
        return 1 - ((y - y_pred)**2).sum() / ((y - y.mean())**2).sum()

透過 Polynomial Regression 我們可以得到百分比大約 75~77 的準確率。

當然這個競賽不僅能使用 Polynomial Regression,透過 KNN 或是 Support Vector Machine 或其他模型都可以完成並也可以得到相似或更好的結果。

完整的 code 可以看 Github 或是去 Kaggle Notebook 實際執行喔~

明天要進入另一個主題 Naive Bayes Classifier 敬請期待

/images/emoticon/emoticon31.gif

Reference

歡迎更仔細閱讀以下相關內容以了解本篇知識


上一篇
[Day 3] Polynomial Regression — 主題實作
下一篇
[Day 5] Naive Bayes — 背後理論
系列文
ML From Scratch31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言